﻿#ifndef SRC_POLLER_SELECTWRAP_H_
#define SRC_POLLER_SELECTWRAP_H_

namespace toolkit {

/**
 * @brief 封装文件描述符集合操作的类
 */
class FdSet {
public:
    FdSet();
    ~FdSet();

    /**
     * @brief 将文件描述符集合清空
     */
    void fdZero();

    /**
     * @brief 将指定文件描述符添加到集合中
     * @param fd 要添加的文件描述符
     */
    void fdSet(int fd);

    /**
     * @brief 从集合中移除指定文件描述符
     * @param fd 要移除的文件描述符
     */
    void fdClr(int fd);

    /**
     * @brief 检查指定文件描述符是否在集合中
     * @param fd 要检查的文件描述符
     * @return 如果存在返回 true，否则返回 false
     */
    bool isSet(int fd);

    void* _ptr;
};

/**
 * @brief 封装的 select 函数
 * @param cnt 要检查的最大文件描述符值加 1
 * @param read 指向读文件描述符集合的指针
 * @param write 指向写文件描述符集合的指针
 * @param err 指向异常文件描述符集合的指针
 * @param tv 指向超时时间结构体的指针
 * @return 就绪的文件描述符数量，出错时返回 -1
 */
int select_wrap(int cnt, FdSet* read, FdSet* write, FdSet* err, struct timeval* tv);

} // namespace toolkit

#endif // SRC_POLLER_SELECTWRAP_H_
